package Inherit.arrays;

import java.lang.reflect.Array;
import java.util.Arrays;

public class CopyOfTest {
    public static void main(String[] args){
        int[] a={1,2,3};
        a=(int[]) goodCopyOf(a,10);
        System.out.println(Arrays.toString(a));

        String[] b={"Tom","Dick","Harry"};
        b=(String[])goodCopyOf(b,10);
        System.out.println(Arrays.toString(b));

        //System.out.println("The following call will generate an exception");
        //b=(String[])badCopyOf(b,10);
    }

    private static Object[] badCopyOf(Object[] b, int newLength) { //not useful
        Object[] newArray=new Object[newLength];
        System.arraycopy(b,0,newArray,0,Math.min(b.length,newLength));
        return newArray;
    }

    /**
     * This method grows an array by allocation a new array of the same type and copying all elements
     * @param a  the array to grow,This can be an object array or a primitive type array
     * @param newLength the new length
     * @return a larger array that contains all elements of a
     */
    private static Object goodCopyOf(Object a, int newLength) {
        Class cl=a.getClass();
        if(!cl.isArray()) return null;

        Class componentType=cl.getComponentType();
        int length= Array.getLength(a);
        Object newArray=Array.newInstance(componentType,newLength);
        System.arraycopy(a,0,newArray,0,Math.min(length,newLength));
        return newArray;
    }
}
